package com.boilerCloud.service.sys.impl;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import javax.annotation.Resource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.boilerCloud.dao.sys.IHzlqswMenuDao;
import com.boilerCloud.dao.sys.IHzlqswRoleDao;
import com.boilerCloud.dto.HzlqswCacheContent;
import com.boilerCloud.dto.HzlqswPage;
import com.boilerCloud.dto.sys.Menu;
import com.boilerCloud.service.sys.IHzlqswMenuService;

/**
 * @类功能说明：
 */
@Service
public class HzlqswMenuServiceImpl implements IHzlqswMenuService {

	@Resource
	private IHzlqswMenuDao menuDao;
	@Resource
	private IHzlqswRoleDao roleDao;
	private static final Logger log = LoggerFactory.getLogger(HzlqswMenuServiceImpl.class);

	/**
	 * 
	 * @参数： @param roleID
	 * @参数： @return
	 * @参数： @throws Exception
	 * @返回： String[]
	 * @抛出异常：
	 */
	@Transactional(propagation = Propagation.NOT_SUPPORTED)
	public String[] getMenuUrlByRole(int roleID) throws Exception {
		log.info("根据角色编号查找用户能用的菜单地址busi ----");
		return menuDao.getMenuUrlByRole(roleID);
	}

	/**
	 * @函数功能说明:获取用户左侧菜单
	 * @创建者：qianfuqiang 2013-8-11
	 * @修改者：
	 * @修改内容：
	 * @参数： @param roleID
	 * @参数： @return
	 * @参数： @throws Exception
	 * @返回： List<Menu>
	 * @抛出异常：
	 */
	@Transactional(propagation = Propagation.NOT_SUPPORTED)
	public List<Menu> getLeftMenu(int roleID) throws Exception {
		List<Menu> list = menuDao.getLeftMenu(roleID);
		Map<Integer,List<Menu>> map = list.stream().
				collect(Collectors.groupingBy(Menu::getPARENTID));
		for (int i = 0; i < list.size(); i++) {
			list.get(i).setChildList(map.get(list.get(i).getID()));
		}
		List<Menu> filterList = list.stream().filter(a -> a.getPARENTID() == 0).collect(Collectors.toList());
		return filterList;
	}


	
	@Override
	public void getMenuList(int roleID, Menu menu,
			HzlqswPage<Menu> page) throws Exception {
		int totalNum =  menuDao.qryMenuListSize(roleID, menu);
		if(totalNum > 0){
			// 查询分页信息
			int length = page.getPageSize();
			int offset = (page.getCurPage() - 1) * length;
			List<Menu> list = menuDao.getMenuList(roleID, offset, length, menu);
			// 设置分页信息（集合和记录总数）
			page.setPageList(list);
			page.setTotalNum(totalNum);
		}
		
	}

	/**
	 * @函数功能说明:添加菜单
	 * @创建者：qianfuqiang 2013-8-13
	 * @修改者：
	 * @修改内容：
	 * @参数： @param menu
	 * @参数： @param roleID
	 * @参数： @throws Exception
	 * @返回： void
	 * @抛出异常：
	 */
	@Transactional(rollbackFor = { Exception.class }, propagation = Propagation.REQUIRED)
	public void addMenu(Menu menu,int roleID) throws Exception {
		//添加菜单
		int menuID = menuDao.addMenu(menu);
		menu.setID(menuID);
		//添加该角色下此菜单
		roleDao.addRoleMen(roleID, menuID);
		// 更新缓存
		// 获取用户菜单权限
		String[] menuUrls = menuDao.getMenuUrlByRole(roleID);
		Arrays.sort(menuUrls);
		// 将权限放入缓存
		HzlqswCacheContent.roleMenuUrls.put(roleID, menuUrls);
	}

	/**
	 * @函数功能说明:删除菜单
	 * @创建者：qianfuqiang 2013-8-13
	 * @修改者：
	 * @修改内容：
	 * @参数： @param id
	 * @参数： @throws Exception
	 * @返回： void
	 * @抛出异常：
	 */
	@Transactional(rollbackFor = { Exception.class }, propagation = Propagation.REQUIRED)
	public void delMenu(int id) throws Exception {
		menuDao.delMenu(id);
		//roleDao.delRoleMenuByMenuID(id);
	}

	/**
	 * @函数功能说明:编辑菜单
	 * @创建者：qianfuqiang 2013-8-13
	 * @修改者：
	 * @修改内容：
	 * @参数： @param menu
	 * @参数： @throws Exception
	 * @返回： void
	 * @抛出异常：
	 */
	@Transactional(rollbackFor = { Exception.class }, propagation = Propagation.REQUIRED)
	public void updateMenu(Menu menu) throws Exception {
		menuDao.updateMenu(menu);
	}
}
